#ifndef __LRC_H__
#define __LRC_H__

// LRC 结构体定义，用于存储一句歌词及其对应的时间
typedef struct lrc{
	int  time;          // 歌词显示的时间点 (单位：秒)
	char lrc_buf[200];  // 存储歌词内容的字符数组
	struct lrc *front; // 指向前一个歌词节点的指针 (用于双向链表)
	struct lrc *next;  // 指向后一个歌词节点的指针 (用于双向链表)
}LRC;

// TIME 结构体定义，用于存储时间 (分钟和秒)
typedef struct
{												 		//ʾʱݽṹ (原注释：显示播放时间的数据结构)
	char minute; // 分钟
	char second; // 秒钟
}TIME;

// 函数声明区域：这些函数在其他 .c 文件中定义，在此处声明以便其他文件可以调用它们。

// 读取源文件内容
// 参数 src_file_name: 文件名
// 返回值: 文件内容的字符串指针
extern char * read_src_file(char *src_file_name);

// 切割歌词缓存区
// 参数 lrc_text: 存储切割后每行歌词指针的数组
// 参数 file_buf: 包含完整歌词的字符串
// 返回值: 歌词的行数
extern int strtok_lrc_buf(char *lrc_text[],char *file_buf);

// 解析LRC文件头部信息 (如歌名、歌手等)
// 参数 song_msg: 存储解析出的歌曲信息的指针数组
// 参数 lrc_text: 包含LRC文件前几行内容的指针数组
extern void lrc_head_resolve(char *song_msg[],char * lrc_text[]);

// 打印歌曲信息
// 参数 song_msg: 存储歌曲信息的指针数组
extern void print_song_message(char * song_msg[]);

// 在歌词链表中搜索指定时间的歌词
// 参数 head: 歌词链表的头指针
// 参数 m_time: 要搜索的时间 (单位：秒)
// 返回值: 找到的LRC节点的指针，未找到则返回NULL
extern LRC* link_search(LRC *head,int m_time);

// 解析LRC歌词内容，构建歌词链表
// 参数 lrc_line: 歌词总行数
// 参数 lrc_text: 存储每行歌词的指针数组
// 返回值: 构建的歌词链表的头指针
extern LRC* lrc_resolve(int lrc_line,char * lrc_text[]);

// 向双向链表中插入新节点 (按时间排序)
// 参数 p_head: 指向链表头指针的指针
// 参数 p_new: 要插入的新LRC节点的指针
extern void double_link_insert(LRC **p_head,LRC *p_new);

// 释放歌词链表的内存
// 参数 head: 歌词链表的头指针
extern void link_free(LRC *head);

// 延时函数
// 参数 sec: 延时的秒数
extern void time_delay(int sec);

// 打印时间
// 参数 m_time: TIME结构体，包含要打印的分钟和秒
extern void  time_printf(TIME m_time);

// 在指定位置以指定颜色打印字符串
// 参数 str: 要打印的字符串
// 参数 x: 屏幕 x 坐标
// 参数 y: 屏幕 y 坐标
// 参数 color: 打印颜色
extern void color_pos_printf(char *str,int x,int y,int color);

// 查找歌词打印的起始点 (用于屏幕显示5行歌词)
// 参数 head: 歌词链表的头指针
// 参数 pb: 当前正在播放的LRC节点指针
// 返回值: 应该开始打印的LRC节点指针
extern LRC * find_start_point(LRC *head,LRC*pb);

// 打印歌词 (通常是5行，当前行高亮)
// 参数 pb: 当前LRC节点指针 (通常是打印的起始点)
// 参数 expect_play_pointer: 期望高亮显示的LRC节点指针 (当前播放的歌词)
extern void lrc_printf(LRC *pb , LRC *expect_play_pointer);

// 时钟计数，更新时间
// 参数 p_m_time: 指向TIME结构体的指针，用于更新时间
extern void m_clock(TIME *p_m_time);

// 释放歌曲头部信息的内存
// 参数 song_msg: 存储歌曲信息的指针数组
extern void song_msg_free(char *song_msg[]);

#endif